#include "thread_pool.h"

// 构造函数，初始化线程池
ThreadPool::ThreadPool(size_t threads) : stop_(false) {
    // 创建指定数量的工作线程
    for (size_t i = 0; i < threads; ++i) {
        workers_.emplace_back([this] {
            // 工作线程主循环
            while(1) {
                std::function<void()> task;
                
                // 等待任务或线程池停止信号
                {
                    std::unique_lock<std::mutex> lock(this->queue_mutex_);
                    
                    // 条件变量等待：当线程池未停止且任务队列为空时阻塞
                    this->condition_.wait(lock,[this] { 
                        return this->stop_ || !this->tasks_.empty(); 
                    });
                    
                    // 如果线程池已停止且任务队列为空，则退出线程
                    if (this->stop_ && this->tasks_.empty()) {
                        return;
                    }
                    
                    // 从任务队列获取任务
                    task = std::move(this->tasks_.front());
                    this->tasks_.pop();
                }
                
                // 执行任务
                task();
            }
        });       
    }
}

// 析构函数，停止线程池
ThreadPool::~ThreadPool() {
    // 设置停止标志
    {
        std::unique_lock<std::mutex> lock(queue_mutex_);
        stop_ = true;
    }
    
    // 唤醒所有工作线程
    condition_.notify_all();
    
    // 等待所有工作线程完成
    for (auto& worker : workers_) {
        worker.join();
    }
}
    